package attend.dao.dept;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import util.DBConnection;
import exception.BaseException;

/**
 * @author yang D
 * @since 2009-01-09
 */
public class DeptDao {
	
	/********************* MEMBER FIELD DEFINDE START **********************/
	
	private StringBuffer 						sb 		= 	new StringBuffer();
	private List<HashMap<String, String>> 		list 	= 	null;
	
	private Connection 							conn 	= 	null;
	private PreparedStatement 					pstmt 	= 	null;
	private ResultSet 							rs 		= 	null;
	
	//팀업데이트시 필요한 파라미터들
	
	//그룹 수정시 리턴 값
	//저장프로시저에서 출력되는 메시지
	private String 								rtn_msg;
	
	private int									rowCount; 

	/********************* MEMBER FIELD DEFINDE E N D **********************/

	/**
	 * <pre>
	 * 생성자 - Connection을 함.
	 * 근태관리 Connection.
	 * </pre>
	 * @throws BaseException exception.BaseException
	 * @throws SQLException 
	 */
	public DeptDao() throws BaseException {
	}
	
	/**
	 * <pre>
	 * 부서관리           조회 건수   
	 * </pre>
	 * @throws BaseException
	 */
	public void countDeptRow() throws BaseException {
		
		try {
			
			conn = DBConnection.getDataSource().getConnection();
			
			sb.setLength(0);
			sb.append("     SELECT COUNT(*)    		CNT																			            \r\n");
			sb.append("     FROM																								            \r\n");
			sb.append("     (																								                \r\n");
			sb.append("     SELECT 										                													\r\n");
            sb.append("     		 A.DEPT_NO UPPER_DEPT_NO , A.DEPT_NM UPPER_DEPT_NM, B.DEPT_NO , B.DEPT_NM , B.USE_YN                   	\r\n");
            sb.append("     FROM                                                                                                            \r\n");
            sb.append("             (                                                                                                       \r\n");
            sb.append("                     --GROUP                                                                                         \r\n");
            sb.append("                     SELECT UPPER_DEPT_NO , DEPT_NO , DEPT_NM ,USE_YN        --그룹명                                                                  \r\n");
            sb.append("                     FROM TB_DEPT                                                                                    \r\n");
            sb.append("                     WHERE DEPT_NO = UPPER_DEPT_NO                                                                   \r\n");
            sb.append("             ) A                                                                                                     \r\n");
            sb.append("                     LEFT OUTER JOIN                                                                                 \r\n");
            sb.append("             (                                                                                                       \r\n");
            sb.append("                     --TEAM                                                                                          \r\n");
            sb.append("                     SELECT UPPER_DEPT_NO ,DEPT_NO ,USE_YN                                                           \r\n");
            sb.append("                             , CASE WHEN DEPT_NO != UPPER_DEPT_NO THEN DEPT_NM ELSE NULL END DEPT_NM --팀명                     \r\n");
            sb.append("                     FROM TB_DEPT                                                                                    \r\n");
            sb.append("                     --WHERE DEPT_NO != UPPER_DEPT_NO                                                                \r\n");
            sb.append("             ) B                                                                                                     \r\n");
            sb.append("                     ON                                                                                              \r\n");
            sb.append("                             A.UPPER_DEPT_NO = B.UPPER_DEPT_NO                                                       \r\n");
            sb.append("     )   Z                                                                                           				\r\n");

            System.out.println("------------------------------------------------------------------------------------");
            System.out.println("부서관리 조회 건 수 ");
			System.out.println(sb.toString());	//쿼리 출력 debug
			System.out.println("------------------------------------------------------------------------------------");
			
			pstmt 					= 	conn.prepareStatement(sb.toString().trim());

			rs 						= 	pstmt.executeQuery();

			if (rs.next()) {
				setRowCount(rs.getInt("CNT"));
			}
			
		}catch (SQLException se){
			se.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(se);
			dex.setAppReturnCode("10");
			throw dex;
		} catch(Exception e){
			e.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(e);
			dex.setAppReturnCode("20");
			throw dex;
		} finally{
			try{
				if (pstmt != null) pstmt.close();
				if (rs != null) rs.close();
				if(conn != null) conn.close();
			} catch(SQLException fse){
				BaseException dex = new BaseException();                
				dex.setException(fse);
				dex.setAppReturnCode("10");
				throw dex;
			} 
		}
	}
	
	/**
	 * 그룹(사업부) / 팀(부서)를 모두 조회함.
	 * @throws BaseException
	 * @throws SQLException
	 */
	public void deptSearch(int start_row , int end_row ) throws BaseException {
		
		try {
			
			conn = DBConnection.getDataSource().getConnection();
			
			sb.setLength(0);
			sb.append("     SELECT *    																					                \r\n");
			sb.append("     FROM																								            \r\n");
			sb.append("     (																								                \r\n");
			sb.append("     SELECT 	ROW_NUMBER() OVER (ORDER BY A.UPPER_DEPT_NO , B.DEPT_NO ) 		ROWNUM									                \r\n");
            sb.append("     		, A.DEPT_NO UPPER_DEPT_NO , A.DEPT_NM UPPER_DEPT_NM, B.DEPT_NO , B.DEPT_NM , B.USE_YN                   \r\n");
            sb.append("     FROM                                                                                                            \r\n");
            sb.append("             (                                                                                                       \r\n");
            sb.append("                     --GROUP                                                                                         \r\n");
            sb.append("                     SELECT UPPER_DEPT_NO , DEPT_NO , DEPT_NM ,USE_YN        --그룹명                                                                  \r\n");
            sb.append("                     FROM TB_DEPT                                                                                    \r\n");
            sb.append("                     WHERE DEPT_NO = UPPER_DEPT_NO                                                                   \r\n");
            sb.append("             ) A                                                                                                     \r\n");
            sb.append("                     LEFT OUTER JOIN                                                                                 \r\n");
            sb.append("             (                                                                                                       \r\n");
            sb.append("                     --TEAM                                                                                          \r\n");
            sb.append("                     SELECT UPPER_DEPT_NO ,DEPT_NO ,USE_YN                                                           \r\n");
            sb.append("                             , CASE WHEN DEPT_NO != UPPER_DEPT_NO THEN DEPT_NM ELSE NULL END DEPT_NM --팀명                     \r\n");
            sb.append("                     FROM TB_DEPT                                                                                    \r\n");
            sb.append("                     --WHERE DEPT_NO != UPPER_DEPT_NO                                                                \r\n");
            sb.append("             ) B                                                                                                     \r\n");
            sb.append("                     ON                                                                                              \r\n");
            sb.append("                             A.UPPER_DEPT_NO = B.UPPER_DEPT_NO                                                       \r\n");
            sb.append("     )   Z                                                                                           				\r\n");
            sb.append("     WHERE          Z.ROWNUM		BETWEEN		" + start_row + "	 AND	    " + end_row + "                                            \r\n");

			System.out.println(sb.toString());	//쿼리 출력 debug
			
			pstmt 					= 	conn.prepareStatement(sb.toString().trim());

			rs 						= 	pstmt.executeQuery();

			//쿼리된 내용을 모두 담을 객체.
			list = new ArrayList<HashMap<String, String>>();
			
			while (rs.next()) {
				//각 행의 각각컬럼의 데이터를 담는다.
				HashMap<String , String>  hash_map = new HashMap<String, String>();
				
				//hash_map.put("대소문자로 구분하여 사용할 것." , "디비에서는 상관없음.");
				//jsp에서 <s:property value='upper_dept_no'/> 와 같아야 함.
				hash_map.put("upper_dept_no" 	, rs.getString("UPPER_DEPT_NO") );	//사업그룹코드
				hash_map.put("upper_dept_nm"	, rs.getString("UPPER_DEPT_NM") );	//사업그룹명
				hash_map.put("dept_no"			, rs.getString("DEPT_NO") );		//팀코드
				hash_map.put("dept_nm"			, rs.getString("DEPT_NM") );		//팀명
				hash_map.put("use_yn"			, rs.getString("use_yn") );			//사용여부
			
				list.add(hash_map);	// 한행의 데이터인 맵객체를 담는다.
			}
			
		}catch (SQLException se){
			se.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(se);
			dex.setAppReturnCode("10");
			throw dex;
		} catch(Exception e){
			e.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(e);
			dex.setAppReturnCode("20");
			throw dex;
		} finally{
			try{
				if (pstmt != null) pstmt.close();
				if (rs != null) rs.close();
				if(conn != null) conn.close();
			} catch(SQLException fse){
				BaseException dex = new BaseException();                
				dex.setException(fse);
				dex.setAppReturnCode("10");
				throw dex;
			} 
		}
		
	}	//deptSearch() END

	/**
	 * <pre>
	 * 사업그룹 수정/등록을 저장프로시저로 처리함.
	 * -사업그룹 사용여부가  N이면
	 * -해당 팀의 사용여부도 N으로 변경된다.
	 * 팀이 하나라도 사용중이라면 그룹을 비활성화 할수 없다.
	 * -Procedure 실행
	 * </pre>
	 * @throws BaseException
	 * @throws SQLException
	 */
	public void updateUpperDept(int upper_dept_no , String upper_dept_nm , String use_yn) throws BaseException , SQLException {
		System.out.println("그룹코드->  "  +  upper_dept_no);
		System.out.println("그룹명 ->  "   +  upper_dept_nm);
		System.out.println("사용여부 ->  " +  use_yn);
		
		try {
			
			conn = DBConnection.getDataSource().getConnection();
			
			//Procedure 실행
			CallableStatement call = conn.prepareCall("{ call DBO.ATTEND_UPDATE_UPPER_DEPT_NOT_USE(? ,? , ? )}");
			
			call.setInt	  ( 1	, 	upper_dept_no);	//그룹코드
			call.setString(	2	, 	upper_dept_nm);	//그룹명
			call.setString(	3	, 	use_yn);		//그룹 사용유무
			
			rs = call.executeQuery();
			
			while (rs.next()) {
				rtn_msg = rs.getString("rtn_msg");	//저장프로시저에서 출력되는 메시지
			}
			
		}catch (SQLException se){
			se.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(se);
			dex.setAppReturnCode("10");
			throw dex;
		} catch(Exception e){
			e.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(e);
			dex.setAppReturnCode("20");
			throw dex;
		} finally{
			try{
				if (pstmt 	!= null) pstmt.close();
				if (rs 		!= null) rs.close();
				if(conn 	!= null) conn.close();
			} catch(SQLException fse){
				BaseException dex = new BaseException();                
				dex.setException(fse);
				dex.setAppReturnCode("10");
				throw dex;
			} 
		}
	}

	/**
	 * <pre>
	 * 사업그룹 입력
	 * </pre>
	 * @throws BaseException
	 * @throws SQLException
	 */
	@Deprecated
	public void insertUperDepte() throws BaseException , SQLException {
		try {
			conn = DBConnection.getDataSource().getConnection();
			
			sb.setLength(0);
			sb.append("     --사업그룹정보 변경								\r\n");
			sb.append("     INSERT INTO										\r\n");
			sb.append("             TB_DEPT									\r\n");
			sb.append("             (										\r\n");
			sb.append("                 UPPER_DEPT_NO       --그룹코드		\r\n");
			sb.append("             ,   DEPT_NM             --그룹명			\r\n");
			sb.append("             ,   USE_YN              --사용유무		\r\n");
			sb.append("             )										\r\n");
			sb.append("     VALUES											\r\n");
			sb.append("             (										\r\n");
			sb.append("                 IDENT_CURRENT('TB_DEPT')			\r\n");
			sb.append("             ,           ?							\r\n");
			sb.append("             ,    UPPER(?)							\r\n");
			sb.append("             )										\r\n");

			System.out.println("사업그룹 INSERT : \r\n" + sb.toString());	//쿼리 출력 debug
			
			pstmt 					= 	conn.prepareStatement(sb.toString().trim());
			
			/**************INSER / UPDATE / DELETE PARAMETERS START****************************/
			pstmt.setString(1, "");
			pstmt.setString(2, "");
			pstmt.setInt(3, 0);
			pstmt.setInt(3, 0);
			/**************INSER / UPDATE / DELETE PARAMETERS END****************************/
			
			//INSER / UPDATE / DELETE SQL 실행.
			pstmt.executeUpdate();
			
		}catch (SQLException se){
			se.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(se);
			dex.setAppReturnCode("10");
			throw dex;
		} catch(Exception e){
			e.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(e);
			dex.setAppReturnCode("20");
			throw dex;
		} finally{
			try{
				if (pstmt != null) pstmt.close();
				if (rs != null) rs.close();
				if(conn != null) conn.close();
			} catch(SQLException fse){
				BaseException dex = new BaseException();                
				dex.setException(fse);
				dex.setAppReturnCode("10");
				throw dex;
			}
		}
	}	//CreateUpperDept() END.

	/**
	 * <pre>
	 * 팀 수정시 필요함.
	 * 선택된 팀의 그룹코드/명 , 팀코드/명을 쿼리하여 가져온다.
	 * </pre> 
	 * 
	 * @param upper_dept_no
	 * @param dept_no
	 * @throws BaseException
	 * @throws SQLException
	 */
	public void retrieveTeamByUpperDeptNoDeptNo(int upper_dept_no , int dept_no) throws BaseException , SQLException {
		System.out.println("그룹코드==> " + upper_dept_no);
		System.out.println("팀코드==>   " + dept_no);
		
		try {
			conn = DBConnection.getDataSource().getConnection();
			
			sb.setLength(0);
			sb.append("                                             \r\n");
			sb.append("     SELECT                                  \r\n");
			sb.append("             A.UPPER_DEPT_NO                 \r\n");
			sb.append("         ,   A.DEPT_NM UPPER_DEPT_NM			\r\n");
			sb.append("         ,   B.DEPT_NO                       \r\n");
			sb.append("         ,   B.DEPT_NM                       \r\n");
			sb.append("         ,   B.USE_YN                        \r\n");
			sb.append("     FROM                                    \r\n");
			sb.append("     (                                       \r\n");
			sb.append("         SELECT                              \r\n");
			sb.append("                 UPPER_DEPT_NO , DEPT_NM     \r\n");
			sb.append("         FROM                                \r\n");
			sb.append("                 TB_DEPT                     \r\n");
			sb.append("         WHERE                               \r\n");
			sb.append("                 UPPER_DEPT_NO 	= ?		    \r\n");
			sb.append("             AND                             \r\n");
			sb.append("                 UPPER_DEPT_NO = DEPT_NO     \r\n");
			sb.append("     ) A                                     \r\n");
			sb.append("     JOIN                                    \r\n");
			sb.append("     (                                       \r\n");
			sb.append("         SELECT                              \r\n");
			sb.append("                 UPPER_DEPT_NO               \r\n");
			sb.append("             ,   DEPT_NO                     \r\n");
			sb.append("             ,   DEPT_NM                     \r\n");
			sb.append("             ,   USE_YN                      \r\n");
			sb.append("         FROM                                \r\n");
			sb.append("                 TB_DEPT                     \r\n");
			sb.append("         WHERE                               \r\n");
			sb.append("                 DEPT_NO 		= ?		    \r\n");
			sb.append("     ) B                                     \r\n");
			sb.append("     ON                                      \r\n");
			sb.append("         A.UPPER_DEPT_NO = B.UPPER_DEPT_NO   \r\n");

			System.out.println("그룹코드 , 팀 코드를  사용하여 그룹과 팀 의 코드/명 SELECT : \r\n" + sb.toString());	//쿼리 출력 debug
			
			pstmt 					= 	conn.prepareStatement(sb.toString().trim());
			
			/************** PARAMETERS START ****************************/
			pstmt.setInt(1, upper_dept_no);		//그룹코드
			pstmt.setInt(2, dept_no);			//팀코드
			/************** PARAMETERS E N D ****************************/
			rs						=	pstmt.executeQuery();
			
			//쿼리된 내용을 모두 담을 객체.
			list = new ArrayList<HashMap<String, String>>();

			while (rs.next()) {
				//각 행의 각각컬럼의 데이터를 담는다.
				HashMap<String , String>  hash_map = new HashMap<String, String>();
				
				//hash_map.put("대소문자로 구분하여 사용할 것." , "디비에서는 상관없음.");
				//jsp에서 <s:property value='upper_dept_no'/> 와 같아야 함.
				hash_map.put("upper_dept_no" 	, rs.getString("UPPER_DEPT_NO") );	//사업그룹코드
				hash_map.put("upper_dept_nm"	, rs.getString("UPPER_DEPT_NM") );	//사업그룹명
				hash_map.put("dept_no"			, rs.getString("DEPT_NO") );		//팀코드
				hash_map.put("dept_nm"			, rs.getString("DEPT_NM") );		//팀명
				hash_map.put("use_yn"			, rs.getString("USE_YN") );			//사용여부
			
				list.add(hash_map);	// 한행의 데이터인 맵객체를 담는다.
			}
			
		}catch (SQLException se){
			se.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(se);
			dex.setAppReturnCode("10");
			throw dex;
		} catch(Exception e){
			e.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(e);
			dex.setAppReturnCode("20");
			throw dex;
		} finally{
			try{
				if (pstmt != null) pstmt.close();
				if (rs != null) rs.close();
				if(conn != null) conn.close();
			} catch(SQLException fse){
				BaseException dex = new BaseException();                
				dex.setException(fse);
				dex.setAppReturnCode("10");
				throw dex;
			} 
		}
	}

	/**
	 * <pre>
	 * 그룹코드를 parameter로 넘겨 받아서
	 * 그룹코드 , 그룹명 , 사용여부를
	 * List객체에 담는다.
	 * </pre>
	 * @param upper_dept_no	-그룹코드
	 * @throws BaseException
	 * @throws SQLException
	 */
	public void retireveUpperDeptNoByUpperDeptNo(int upper_dept_no) throws BaseException , SQLException {
		
		System.out.println("그룹코드==> " + upper_dept_no);
		
		try {
			conn = DBConnection.getDataSource().getConnection();
			
			sb.setLength(0);
			sb.append("     SELECT                                                                         	\r\n");
			sb.append("             UPPER_DEPT_NO                   --그룹코드                             					\r\n");
			sb.append("             , DEPT_NM       UPPER_DEPT_NM   --그룹명                               						\r\n");
			sb.append("             , USE_YN                        --사용여부                             					\r\n");
			sb.append("     FROM                                                                           	\r\n");
			sb.append("             TB_DEPT                         --부서테이블                           					\r\n");
			sb.append("     WHERE                                                                          	\r\n");
			sb.append("             UPPER_DEPT_NO = DEPT_NO         --그룹코드와 팀코드가 같으면 그룹.     		\r\n");
			sb.append("         AND                                                                        	\r\n");
			sb.append("             UPPER_DEPT_NO = ?               --parameter 그룹코드                   				\r\n");

			System.out.println("그룹코드를  사용하여 그룹코드/명 SELECT : \r\n" + sb.toString());	//쿼리 출력 debug
			
			pstmt 					= 	conn.prepareStatement(sb.toString().trim());
			
			/************** PARAMETERS START ****************************/
			pstmt.setInt(1, upper_dept_no);		//그룹코드
			/************** PARAMETERS E N D ****************************/
			rs						=	pstmt.executeQuery();
			
			//쿼리된 내용을 모두 담을 객체.
			list = new ArrayList<HashMap<String, String>>();

			while (rs.next()) {
				//각 행의 각각컬럼의 데이터를 담는다.
				HashMap<String , String>  hash_map = new HashMap<String, String>();
				
				//hash_map.put("대소문자로 구분하여 사용할 것." , "디비에서는 상관없음.");
				//jsp에서 <s:property value='upper_dept_no'/> 와 같아야 함.
				hash_map.put("upper_dept_no" 	, rs.getString("UPPER_DEPT_NO") );	//사업그룹코드
				hash_map.put("upper_dept_nm"	, rs.getString("UPPER_DEPT_NM") );	//사업그룹명
				hash_map.put("use_yn"			, rs.getString("USE_YN") );			//사용여부
			
				list.add(hash_map);	// 한행의 데이터인 맵객체를 담는다.
			}
			
		}catch (SQLException se){
			se.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(se);
			dex.setAppReturnCode("10");
			throw dex;
		} catch(Exception e){
			e.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(e);
			dex.setAppReturnCode("20");
			throw dex;
		} finally{
			try{
				if (pstmt != null) pstmt.close();
				if (rs != null) rs.close();
				if(conn != null) conn.close();
			} catch(SQLException fse){
				BaseException dex = new BaseException();                
				dex.setException(fse);
				dex.setAppReturnCode("10");
				throw dex;
			} 
		}
	}
	
	/**
	 * 팀정보 등록/수정
	 * @param upper_dept_no	-그룹코드
	 * @param dept_no		-팀코드
	 * @param dept_nm		-팀명
	 * @param use_yn		-사용여부
	 */
	public void updateLowerDept(int upper_dept_no , int dept_no , String dept_nm , String use_yn) throws BaseException , SQLException {
		System.out.println("upper_dept_no-->	" + upper_dept_no);
		System.out.println("dept_no-->	" + dept_no);
		System.out.println("dept_nm-->	" + dept_nm);
		System.out.println("use_yn-->	" + use_yn);
		try {
			conn = DBConnection.getDataSource().getConnection();
			//Procedure 실행
			CallableStatement call = conn.prepareCall("{ CALL DBO.ATTEND_REG_MOD_TEAM_DEPT(? , ? ,? , ? )}");
			
			call.setInt	  ( 1	, 	upper_dept_no);	//그룹코드
			call.setInt	  ( 2	, 	dept_no);		//팀코드
			call.setString( 3	, 	dept_nm);		//팀명
			call.setString(	4	, 	use_yn);		//그룹 사용유무
			
			rs = call.executeQuery();
			
			while (rs.next()) {
				rtn_msg = rs.getString("rtn_msg");	//저장프로시저에서 출력되는 메시지
			}

			System.out.println("rtn_msg-->	" + rtn_msg);
			
		}catch (SQLException se){
			se.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(se);
			dex.setAppReturnCode("10");
			throw dex;
		} catch(Exception e){
			e.printStackTrace();
			BaseException dex = new BaseException();                
			dex.setException(e);
			dex.setAppReturnCode("20");
			throw dex;
		} finally{
			try{
				if (pstmt != null) pstmt.close();
				if (rs != null) rs.close();
				if(conn != null) conn.close();
			} catch(SQLException fse){
				BaseException dex = new BaseException();                
				dex.setException(fse);
				dex.setAppReturnCode("10");
				throw dex;
			} 
		}
	}


	/************************** GETTER / SETTER START ************************/
	// getter / setter
	public List<HashMap<String, String>> getList() {
		return list;
	}

	public void setList(List<HashMap<String, String>> list) {
		this.list = list;
	}

	/**
	 * @return the rtn_msg
	 */
	public String getRtn_msg() {
		return rtn_msg;
	}

	/**
	 * @param rtn_msg the rtn_msg to set
	 */
	public void setRtn_msg(String rtn_msg) {
		this.rtn_msg = rtn_msg;
	}
	
	public int getRowCount() {
		return rowCount;
	}

	public void setRowCount(int rowCount) {
		this.rowCount = rowCount;
	}


	/************************** GETTER / SETTER E N D ************************/

}
